/**   
 * @Title: AtomicExample1.java 
 * @Package com.liumm.concurrently.example.atomic 
 * @Description: TODO
 * @author liumm   
 * @date 2018年4月18日 下午10:04:08 
 * @version V1.0   
 */
package com.liumm.concurrently.example.atomic;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;

import com.liumm.concurrently.annoations.ThreadSafe;

import lombok.extern.slf4j.Slf4j;

/** 
 * @ClassName: AtomicExample1 
 * @Description: TODO
 * @author liumm 
 * @date 2018年4月18日 下午10:04:08 
 *  
 */

@Slf4j
@ThreadSafe
public class AtomicExample1 {
	// 请求总数
	public static int clientTotal = 5000;

	// 同时并发执行的线程数
	public static int threadTotal = 200;

	public static AtomicInteger count = new AtomicInteger(0);

	public static void main(String[] args) throws Exception {
		ExecutorService executorService = Executors.newCachedThreadPool();
		final Semaphore semaphore = new Semaphore(threadTotal);
		final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
		for (int i = 0; i < clientTotal; i++) {
			executorService.execute(() -> {
				try {
					semaphore.acquire();
					add();
					semaphore.release();
				} catch (Exception e) {
					log.error("exception", e);
				}
				countDownLatch.countDown();
			});
		}
		countDownLatch.await();
		executorService.shutdown();
		log.info("count:{}", count.get());
	}

	private static void add() {
		count.incrementAndGet();
		// count.getAndIncrement();
	}
}
